package IAPract2;
import java.util.ArrayList;

import aima.util.Pair;
import IA.Gasolina.CentrosDistribucion;
import IA.Gasolina.Gasolinera;
import IA.Gasolina.Gasolineras;

public class IAPrac1Representacio {	
	
	/* Variables de classe */
	private ArrayList<Integer> assignacions;
	private static ArrayList<Integer> gasAsociada;
	private static ArrayList<Integer>	idAsociat;	
	private static CentrosDistribucion centros;
	private static Gasolineras gasolineras;	
	
	// Estado de cada centro (km actuales recorridos, viajes actuales hechos)
	private static ArrayList<estadoCentro> estado;
	
	/* parametres */
	private static final int nGas = 100;
	private static final int nCent = 10;
	private static final int seed1 = 1234;
	private static final int seed2 = 1234;
	private static final int mult = 1;	
	private int totalPet;
	public static String SWAP = "Swap";		
	
	IAPrac1Representacio() {	
		initialize();			
	}	
	
	public void initialize(){				
	
		gasolineras = new Gasolineras(nGas, seed1);
		centros = new CentrosDistribucion(10, mult, seed2);	
		estado = new ArrayList<estadoCentro> ();		
		gasAsociada = new ArrayList<Integer>(nGas);
		
		// Estado de las restricciones de cada centro
		for (int i = 0; i < nCent; i++){
			int x = centros.get(i).getCoordX();
			int y = centros.get(i).getCoordY();
			estado.add(new estadoCentro(x,y,gasolineras));			
		}
		
		// total de peticiones
		totalPet = 0;			 		
		for (int i = 0; i < gasolineras.size(); i++) {				
			totalPet += gasolineras.get(i).getPeticiones().size();			
		}				
				
		idAsociat = new ArrayList<Integer>(totalPet);
		
		/*Asociamos peticiones totales con gasolineras y sus respeectivas peticiones*/
		int actual = 0;
		for(int i = 0; i < gasolineras.size(); i++){
			
			Gasolinera g = gasolineras.get(i);
			int numPet = (g.getPeticiones()).size();
			for (int j = 0; j < numPet; j++){
				gasAsociada.set(actual+j, i);
				idAsociat.set(actual+j, j);
				
			}				
			actual += numPet;			
		}		
	}
	
	public void setAssignacions(ArrayList<Integer> assignacions){
		this.assignacions = assignacions;
		
	}
	
	public void setEstado(ArrayList<estadoCentro> estado){
		this.estado = estado;		
	}
	
	public ArrayList<estadoCentro> getEstado(){
		return estado;
	}
		
	public int get(int idPeticio){
		return assignacions.get(idPeticio);
	}	
	
	public ArrayList<Integer> getGasAsociadas(){
		return gasAsociada;
	}
	
	
	public int getIdAssociat(int i){
		return idAsociat.get(i);
	}
	
	
	public Gasolineras getGasolineras(){
		return gasolineras;
	}
	
	
	public ArrayList<Integer> getAssignacions(){
		return assignacions;
	}	
	
	
	public CentrosDistribucion getCentrosDistribucion(){
		return centros;
	}
	
	
	public ArrayList<Integer> getIdAssociats(){
		return idAsociat;
	}
	
	public int size(){
		return assignacions.size();	
	}	
	
	// deberia ser private para no confundirlo con un operador
	public void set(int idPeticio, int idCentre){
		assignacions.set(idPeticio,idCentre);
	}
	
	public void swap(int idPeticio1, int idPeticio2){
		int aux = assignacions.get(idPeticio1);
		assignacions.set(idPeticio1, assignacions.get(idPeticio2));
		assignacions.set(idPeticio2, aux);	
	}	
	
	public int getTotalKm(){
		int total = 0;
		for (int i = 0; i < estado.size(); i++)
			total += estado.get(i).getKm();
		
		return total;
	}

	public int getCoordXMitja() {
		// TODO Auto-generated method stub
		return 0;
	}

	public int getCoordYMitja() {
		// TODO Auto-generated method stub
		return 0;
	}	
}
